﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using FA.Library.Util;
using System.ComponentModel;

namespace FA.Library.Sim.Aircraft
{
    public interface AircraftInstruments : ICloneable, INotifyPropertyChanged
    {
        /// <summary>
        /// True airspeed.
        /// </summary>
        float AirspeedTrue { get; set; }

        /// <summary>
        /// Indicated airspeed.
        /// </summary>
        float AirspeedIndicated { get; set; }

        /// <summary>
        /// Angle of “True” calibration scale on airspeed indicator.
        /// </summary>
        float AirspeedTrueCalibrate { get; set; }

        /// <summary>
        /// Redline airspeed (dynamic on some aircraft).
        /// </summary>
        float AirspeedRedLine { get; }

        /// <summary>
        /// Vertical speed indication.
        /// </summary>
        float VerticalSpeed { get; set; }

        /// <summary>
        /// Stall warning.
        /// </summary>
        bool StallWarning { get; }

        /// <summary>
        /// Overspeed warning.
        /// </summary>
        bool OverspeedWarning { get; }

        /// <summary>
        /// Altimeter indication.
        /// </summary>
        float AltimeterIndication { get; set; }

        /// <summary>
        /// Altimeter setting.
        /// </summary>
        float AltimeterSettingMB { get; set; }

        /// <summary>
        /// Attitude Indicator pitch indication.
        /// </summary>
        float AttitudeIndicatorPitch { get; }

        /// <summary>
        /// Attitude Indicator bank indication.
        /// </summary>
        float AttitudeIndicatorBank { get; }

        /// <summary>
        /// Attitude Indicator pitch reference bars.
        /// </summary>
        float AttitudeIndicatorPitchBarsPosition { get; }

        /// <summary>
        /// Attitude Indicator caged state.
        /// </summary>
        bool AttitudeIndicatorCaged { get; }

        /// <summary>
        /// Magnetic compass indication.
        /// </summary>
        float MagneticCompassIndication { get; set; }

        /// <summary>
        /// Heading indicator gyro. 
        /// </summary>
        float HeadingIndicator { get; set; }

        /// <summary>
        /// Rate of turn of heading indicator.
        /// </summary>
        float HeadingIndicatorDeltaRate { get; set; }

        /// <summary>
        /// Angular error of heading indicator.
        /// </summary>
        float HeadingIndicatorDriftError { get; }

        /// <summary>
        /// Turn coordinator ball from -127 to 127.
        /// </summary>
        float TurnCoordinatorBallPosition { get; }

        /// <summary>
        /// Angle of attack indicator.
        /// </summary>
        float AngleOfAttackIndicator { get; }

        /// <summary>
        /// Radar altitude.
        /// </summary>
        float RadarAltitude { get; }

        /// <summary>
        /// Gauge fail flag (0 = ok, 1 = fail, 2 = blank)
        /// </summary>
        bool PanelADF { get; set; }

        /// <summary>
        /// Gauge fail flag (0 = ok, 1 = fail, 2 = blank)
        /// </summary>
        bool PanelAirspeed { get; set; }

        /// <summary>
        /// Gauge fail flag (0 = ok, 1 = fail, 2 = blank)
        /// </summary>
        bool PanelAltimeter { get; set; }

        /// <summary>
        /// Gauge fail flag (0 = ok, 1 = fail, 2 = blank)
        /// </summary>
        bool PanelAttitude { get; set; }

        /// <summary>
        /// Gauge fail flag (0 = ok, 1 = fail, 2 = blank)
        /// </summary>
        bool PanelComm { get; set; }

        /// <summary>
        /// Gauge fail flag (0 = ok, 1 = fail, 2 = blank)
        /// </summary>
        bool PanelCompass { get; set; }

        /// <summary>
        /// Gauge fail flag (0 = ok, 1 = fail, 2 = blank)
        /// </summary>
        bool PanelElectrical { get; set; }

        /// <summary>
        /// Gauge fail flag (0 = ok, 1 = fail, 2 = blank)
        /// </summary>
        bool PanelAvionics { get; }

        /// <summary>
        /// Gauge fail flag (0 = ok, 1 = fail, 2 = blank)
        /// </summary>
        bool PanelEngine { get; set; }

        /// <summary>
        /// Gauge fail flag (0 = ok, 1 = fail, 2 = blank)
        /// </summary>
        bool PanelFuelIndicator { get; }

        /// <summary>
        /// Gauge fail flag (0 = ok, 1 = fail, 2 = blank)
        /// </summary>
        bool PanelHeading { get; set; }

        /// <summary>
        /// Gauge fail flag (0 = ok, 1 = fail, 2 = blank)
        /// </summary>
        bool PanelVerticalVelocity { get; set; }

        /// <summary>
        /// Gauge fail flag (0 = ok, 1 = fail, 2 = blank)
        /// </summary>
        bool PanelTransponder { get; set; }

        /// <summary>
        /// Gauge fail flag (0 = ok, 1 = fail, 2 = blank)
        /// </summary>
        bool PanelNav { get; set; }

        /// <summary>
        /// Gauge fail flag (0 = ok, 1 = fail, 2 = blank)
        /// </summary>
        bool PanelPitot { get; set; }

        /// <summary>
        /// Gauge fail flag (0 = ok, 1 = fail, 2 = blank)
        /// </summary>
        bool PanelTurnCoordinator { get; }

        /// <summary>
        /// Gauge fail flag (0 = ok, 1 = fail, 2 = blank)
        /// </summary>
        bool PanelVacuum { get; set; }

        /// <summary>
        /// Vacuum system suction pressure.
        /// </summary>
        float SuctionPressure { get; set; }
    }
}
